import router from "@/router";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import pinia from "@/stores";
import { useUserInfoStore } from "@/stores/userInfo";
import { ElMessage } from "element-plus";
import getPageTitle from "./utils/get-page-title";

NProgress.configure({ showSpinner: false });
const userInfoStore = useUserInfoStore(pinia);

// 不用进行token检查的白名单路径数组
const whiteList = ["/login"];

// 路由加载前
router.beforeEach(async (to, from, next) => {
	// 在显示进度条
	NProgress.start();

	// 设置整个页面的标题
	document.title = getPageTitle(to.meta.title as string);

	const token = userInfoStore.token;
	// 如果token存在(已经登陆或前面登陆过)
	if (token) {
		// 如果请求的是登陆路由
		if (to.path === "/login") {
			// 直接跳转到根路由, 并完成进度条
			next({ path: "/" });
			NProgress.done();
		} else {
			// 请求的不是登陆路由
			// 是否已经登陆
			const hasLogin = !!userInfoStore.userInfo.name;
			// 如果已经登陆直接放行
			if (hasLogin) {
				next();
			} else {
				// 如果还没有登陆
				try {
					// 异步请求获取用户信息(包含权限数据) ==> 动态注册用户的权限路由 => 当次跳转不可见
					await userInfoStore.getInfo();
					//此时刚刚请求完用户信息,也就是说addRoute就开始添加异步路由了,但是我们此时直接去next放行,addRoute还没有执行结束,所以就会找不到路径导致白屏,我们在这里不要直接放行,而是重新访问一下路由即可
					next(to); // 重新跳转去目标路由, 能看到动态添加的异步路由, 且不会丢失参数
					NProgress.done(); // 结束进度条
				} catch (error: any) {
					// 如果请求处理过程中出错
					// 重置用户信息
					await userInfoStore.reset();
					// 提示错误信息
					// ElMessage.error(error.message || 'Has Error') // axios拦截器中已经有提示了
					// 跳转到登陆页面, 并携带原本要跳转的路由路径, 用于登陆成功后跳转
					next(`/login?redirect=${to.path}`);
					// 完成进度条
					NProgress.done();
				}
			}
		}
	} else {
		// 没有token
		// 如果目标路径在白名单中(是不需要token的路径)
		if (whiteList.indexOf(to.path) !== -1) {
			// 放行
			next();
		} else {
			// 如果没在白名单中, 跳转到登陆路由携带原目标路径
			next(`/login?redirect=${to.path}`);
			// 完成进度条  当次跳转中断了, 要进行一个新的跳转了
			NProgress.done();
		}
	}
});

// 路由加载后
router.afterEach(() => {
	NProgress.done();
});
